﻿
import { ModuleC, ModuleManager, ModuleS, oTrace, SoundManager } from "odin";
import { Consts } from "../../Consts";
import { GameModuleC, GameModuleS } from "../game/GameModule";
/**
 * @Author: zhaolei
 * @Date: 2022-08-01 14:39:58
 * @LastEditors: zhaolei
 * @Description: 怪物模块
 * 服务端-负责管理玩家进入怪物房间，控制boss攻击玩家
 * 客户端-负责怪物攻击的动作表现和触发的陷阱技能表现
 */
export class MonsterModuleS extends ModuleS<MonsterModuleC, null> {

	/**
	 * 怪物人形对象（替换为玩家对象）
	 */
	private _monster: GamePlay.Player;
	
	/**
	 * npc人形对象
	 */
	private _NPC: GamePlay.Humanoid;

	/**
	 * 怪物攻击倒计时
	 */
	private _attackTime: number = 0;
	/**
	 * 参战玩家列表
	 */
	private _players: number[];
	/**
	 * 怪物当前血量（玩家）
	 */
	private _monsterHp: number = 100;

	//NPC受到攻击，直接死亡,播放布娃娃效果
	private NPCDie()
	{
		this._NPC = MWCore.GameObject.find(Consts.NPC) as GamePlay.Humanoid;
		this._NPC.ragdoll(true);

		setTimeout(() => {
			this._NPC.ragdoll(false);
			this._NPC.location = new Type.Vector(5815.43, 3490, 395);//(未实现随机出生地点)
		}, 3000);
	}
	

	/*
	override onAwake(): void {
		this._players = [];
		// 找到进入怪物房间的触发器
		const trigger = MWCore.GameObject.find(Consts.MONSTER_ENTER_TRIGGER) as GamePlay.Trigger;
		trigger.onEnter.add((gameObject) => {
			// 玩家进入Boss传送区域，将玩家添加到boss目标列表，并将玩家传送到boss房间，更新游戏状态为战斗状态
			if (GamePlay.isCharacter(gameObject)) {
				const player = (gameObject as GamePlay.Character).player;
				this._players.push(player.getPlayerID());
				player.character.location = new Type.Vector(-2016.47, 4545.68, 10280);
				ModuleManager.instance.getModule(GameModuleS).enterBattle(player);
			}
		});
		this._monster = MWCore.GameObject.find(Consts.MONSTER) as GamePlay.Humanoid;

	}*/

	/**
	 * 怪物每隔2秒自动发动一次攻击
	 * @param dt 
	 */
	//override onUpdate(dt: number): void {
		//if (this._players.length > 0 && this._monsterHp > 0) {
		//	if (this._attackTime <= 0) {
				// 播放怪物攻击动画
		//		this._monster.playAnimation(Consts.MONSTER_ATTACK_ANIMATION);
		//		this._attackTime = 2;
				/**
				 * 通知所有客户端创建攻击
				 */
		//		this.callWorldClientFun(this.client.net_monsterAttack(this._players));
		//	}
		//	this._attackTime -= dt;
		//}
	//}

	/**
	 * 玩家挨打，当血量小于0时怪物进入死亡状态，播放布娃娃效果
	 */
	public async onMonsterHit() {
		this._monster=await GamePlay.asyncGetCurrentPlayer();
		let character=this._monster.character;
		this._monsterHp -= 30;
		// 通知游戏模块更新血条
		ModuleManager.instance.getModule(GameModuleS).onMonsterHpChange(this._monsterHp);
		if (this._monsterHp <= 0) {
			character.ragdoll(true);
			setTimeout(() => {
				character.ragdoll(false);
				character.location = new Type.Vector(5815.43, 3490, 395);//未实现随机出生
			}, 3000);
		}
	}

// 	/**
// 	 * 玩家挨打，直接死亡,当怪物发出的技能命中玩家后由客户端调用
// 	 */
// 	public net_hitPlayer() {
// 		const index = this._players.indexOf(this.currentPlayerId);
// 		if (index >= 0) {
// 			// 把玩家移除出怪物作战列表，玩家不再受到怪物攻击
// 			this._players.splice(index, 1);
// 		}
// 		// 玩家传送到boss传送门面前
// 		this.currentPlayer.character.ragdoll(true);
// 		const player = GamePlay.getPlayer(this.currentPlayerId);
// 		setTimeout(() => {
// 			player.character.ragdoll(false);
// 			player.character.location = new Type.Vector(5815.43, 3490, 395);
// 		}, 3000);
// 	}

 }
export class MonsterModuleC extends ModuleC<MonsterModuleS, null> {
	// /**
	//  * 怪物发出的所有技能对象
	//  */
	// private _traps: Trap[];

	// public override onAwake(): void {
	// 	this._traps = [];
	// 	const monster = MWCore.GameObject.find(Consts.MONSTER) as GamePlay.Humanoid;
	// 	// 给怪物挂一把武器
	// 	monster.attachGameObjectToCharacter(MWCore.GameObject.spawnGameObject(Consts.MONSTER_WEAPON), GamePlay.CharacterSocketType.Right_Hand);
	// }

	// /**
	//  * 创建怪物攻击技能对象，由服务端调用
	//  * @param players 
	//  */
	// public net_monsterAttack(players: number[]) {
	// 	players.forEach(playerId => {
	// 		const trap = MWCore.GameObject.spawnGameObject(Consts.MONSTER_TRAP);
	// 		const loc = GamePlay.getPlayer(playerId).character.location;
	// 		loc.z = 10200;
	// 		trap.location = loc;
	// 		this._traps.push(new Trap(trap, playerId => {
	// 			if (playerId == this.currentPlayerId) {
	// 				// 怪物技能命中自己，直接死亡，退出战斗
	// 				ModuleManager.instance.getModule(GameModuleC).quitBattle();
	// 				this.server.net_hitPlayer();
	// 			}
	// 		}));
	// 	});
	// }

// 	/**
// 	 * 怪物技能更新入口，负责每一帧更新所有的怪物技能
// 	 * @param dt 
// 	 */
// 	public override onUpdate(dt: number): void {
// 		for (const trap of this._traps) {
// 			if (trap.onUpdate(dt)) {
// 				this._traps.splice(this._traps.indexOf(trap), 1);
// 			}
// 		}
// 	}


// }
// /**
//  * 怪物技能类，负责怪物攻击的表现和伤害判断
//  */
// class Trap {
// 	/**
// 	 * 示警特效
// 	 */
// 	private _warning: GamePlay.EffectSystem;
// 	/**
// 	 * 伤害触发器
// 	 */
// 	private _trigger: GamePlay.BoxTrigger;
// 	/**
// 	 *爆炸特效
// 	 */
// 	private _bombing: GamePlay.EffectSystem;
// 	/**
// 	 * 尖刺特效
// 	 */
// 	private _spike: MWCore.GameObject;
// 	/**
// 	 * 表现和伤害发起计时
// 	 */
// 	private _time: number;
// 	/**
// 	 * 突刺临时位置
// 	 */
// 	private _tempSpikeLoc: Type.Vector;
// 	/**
// 	 * 是否有伤害
// 	 */
// 	private _isTriggerEnable: boolean;
// 	/**
// 	 * 
// 	 * @param gameObject 地刺root节点
// 	 * @param onHit 伤害回调，命中后回调该方法
// 	 */
// 	constructor(public gameObject: MWCore.GameObject, onHit: (playerId: number) => void) {
// 		const childs = gameObject.getChildren();
// 		oTrace("fdsfewfs", childs.length);
// 		this._warning = childs[0] as GamePlay.EffectSystem;
// 		this._trigger = childs[1] as GamePlay.BoxTrigger;
// 		this._spike = childs[2];
// 		this._bombing = childs[3] as GamePlay.EffectSystem;
// 		this._time = 0;
// 		const spikeLocation = this._spike.location;
// 		this._tempSpikeLoc = new Type.Vector(spikeLocation.x, spikeLocation.y, spikeLocation.z);
// 		this._trigger.setCollisionEnabled(false);
// 		//伤害计算判断
// 		this._trigger.onEnter.Add((gameObject) => {
// 			if (GamePlay.isCharacter(gameObject)) {
// 				const playerId = (gameObject as GamePlay.Character).player.getPlayerID();
// 				onHit(playerId);
// 			}
// 		})
// 	}

// 	/**
// 	 * 计算地刺时间，做地刺表现
// 	 * @param dt 
// 	 * @returns true-表示技能结束
// 	 */
// 	public onUpdate(dt: number): boolean {
// 		const isTrigger = this._time < 2;
// 		this._time += dt;
// 		if (this._time >= 2) {
// 			if (isTrigger) {
// 				SoundManager.instance.play3DSound(Consts.TRAP_SOUND, this._trigger.location, 1);
// 				this._warning.stop();
// 				this._bombing.play();
// 				this._trigger.setCollisionEnabled(true);
// 				this._isTriggerEnable = true;
// 			}
// 			if (this._tempSpikeLoc.z < 10200) {
// 				this._tempSpikeLoc.z += dt * 1000;
// 				this._spike.location = this._tempSpikeLoc;
// 				this._trigger.location = this._tempSpikeLoc;
// 			} else if (this._isTriggerEnable) {
// 				this._trigger.setCollisionEnabled(false);
// 			}
// 		}

// 		if (this._time >= 4) {
// 			this.gameObject.destroy();
// 			return true;
// 		}
// 		return false;
// 	}

 }